路径规划 室外模拟导航

最后更新时间:2019年7月5日

功能描述

完整意义上的地图导航,包括两部分,一是路线规划,二是路径引导(导航)。只有规划出路线之后,才能进行路径引导。

路径规划,即通过起点、途经点、终点以及偏好设置,基于导航数据分析计算,规划出想要的最佳路径。MapGIS Mobile 10.3 for iOS SDK导航模块提供的功能接口,支持针对不同的路线规划需求,如距离最短、时间最快、费用最低等多偏好设置;多个途经点和避让区的设置;跨楼层的室内路径计算,以及室内外一体化的路径计算。不同需求采用不同接口,来满足实际应用中的各种需求。

实现方法

路径规划功能实现的一般流程如下图所示:

路径规划实现方法.png

1

构造路径规划对象

MGSRouteAnalysis *routeAnalysis=[[MGSRouteAnalysis alloc] init];

2

初始化路径分析对象

通过室内外导航数据路径,初始化路径分析对象。

//室外导航数据路径
NSString* outDoorPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"/MapGIS Mobile 2D Sample/Navigation/outdoor/WuhanNavi.db"];
//室内导航数据文件夹路径
NSString* inDoorPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"/MapGIS Mobile 2D Sample/Navigation/indoor"];
//初始化路径分析对象,为路径规划对象设置导航数据路径(参数1:室外导航数据文件路径;参数2:室内导航数据目录)
[routeAnalysis initWithDBPath:outDoorPath indoorNaviDBsPath:inDoorPath];

3

确定路径点

确定导航的出发地、途经点、目的地,可通过GPS定位功能获取设备当前定位点作为起点,也可通过POI搜索获取,或者通过用户手势交互选点获取;起点、途经点、终点可用图像MGSGraphicImage方式绘制显示在地图上。

//确定路径规划的起点、终点,需要的话可以设置中间点。
MGSDot startDot=MGSDotMake(12735780.301316,3563458.653495);  //起点
MGSDot wayDot1=MGSDotMake(12725802,3571690);                 //途经点,可有多个
MGSDot endDot=MGSDotMake(12725802,3571690);                  //终点
//创建路径点
MGSWayPoint *startWayPoint=[[MGSWayPoint alloc] initWithDot:startDot];
MGSWayPoint *middleWayPoint1=[[MGSWayPoint alloc] initWithDot:wayDot1];
MGSWayPoint *endWayPoint=[[MGSWayPoint alloc] initWithDot:endDot];
//创建路径点数组对象
NSMutableArray *wayPointArray=[[NSMutableArray alloc] init];
[wayPointArray addObject:startWayPoint];
[wayPointArray addObject:middleWayPoint1];
[wayPointArray addObject:endWayPoint];

重要说明:在构造路径点MGSWayPoint对象时,室内、室外路径点的构造方式不一样:

MGSWayPoint *wayPoint=[[MGSWayPoint alloc] initWithDot:wayDot];
//构造MGSWayPoint路径点对象,楼层为9层,楼栋为598号
MGSWayPoint *wayPoint=[[MGSWayPoint alloc] initWithInfo:wayDot floorID:8 buildingID:598];   //-1为负一层,0为第一层,1为第二层,以此类推

4

计算路径

在准备工作完成后,使用室内外一体化路径规划接口calculationRoute计算路径。如下:设置目标行进的方向、室外算路模式为距离最短、室内算路模式室内优先电梯、不设置规避区、不设置车牌号。

//计算路径,返回MGSRoute数组
NSArray<MGSRoute*>* routeArray=[routeAnalysis calculationRoute:-1.0f wayPoints:wayPointArray naviMode:DrivingLeastDistance naviModeIndoor:WalkDefault avoidRegions:nil avoidRegionsCount:0 plateNO:nil];

calculationRoute接口具体说明如下,可通过各种参数的设置来实现特定的功能。

接口 说明
- (NSArray<MGSRoute*>*)calculationRoute:(float)angle wayPoints:(NSArray<MGSWayPoint*>*)wayPoints naviMode:(int)naviMode naviModeIndoor:(int)naviModeIndoor avoidRegions:(MGSRect*)avoidRegions avoidRegionsCount:(long)avoidRegionsCount plateNO:(NSString*)plateNO;
参数:定位目标行进的方向、路径点、室外道路算路模式、室内道路算路模式、规避区域、车牌号
路径计算

SDK提供了多种算路模式,可以根据个人偏好,设置不同参数来得到不同的导航路线:室外导航可以选择步行或者驾车;驾车的话可以选择距离最短、用时最少或者最省钱的路线;室内导航可以选择优先电梯或者优先楼梯的路线。如下表所示,各种算路模式对应MGSRouteMode中的字段常量。同时,算路模式的实现必须有相应的数据支持。

算路模式 算路模式参数
室外 驾车最短距离 DrivingLeastDistance
驾车时间最短 DrivingLeastTime
驾车最省钱 DrivingSaveMoney
步行 WalkDefault
室内 室内优先电梯 RouteModeIndoorPreferElevator
室内优先自动扶梯 RouteModeIndoorPreferEscalator
室内优先楼梯 RouteModeIndoorPreferStairs

5

获取路径信息

路径规划成功后,得到路径,通过获取MGSRoute路线对象获取信息,如路线坐标点、路段描述、路段数目、路径外包矩形等。最重要的是路线的绘制,可通过纹理线绘制功能将路线的坐标点绘制成线展示在地图上。

//获取计算得到的第一条路径
MGSRoute *resultRoute=routeArray[0];
NSString *routeOverView=[route overview];   //获取路径概况
MGSDot *routeDots = [route coors];          //获取路径所有坐标点,用于路线的绘制显示
long routeDotsCount = [route dotsCount];    //获取路径坐标点个数
MGSRect routeRect=[route boundingRect];     //获取路径外包矩形,可用于将地图缩放到此范围
long routeLength=[route length];            //获取路径长度
MGSDot routeSDot=[route startPos];          //获取路径起点坐标
MGSDot routeEDot=[route targetPos];         //获取路径终点坐标
int routeStepCount = [route stepCount];     //获取路径中路段数目

//路线绘制:绘制纹理线
MGSGraphicPolylin *routeGraphicPolylin=[[MGSGraphicPolylin alloc] init]; //创建线图形对象
[routeGraphicPolylin setFillTextureImage:[UIImage imageNamed:@"ico_texture_line.png"]];  //设置填充纹理
[routeGraphicPolylin setLineWidth:8];                               //设置线宽
[routeGraphicPolylin setPoints:routeDots andCount:routeDotsCount];  //设置坐标点
[[_mapView graphicsOverlay] addGraphic:routeGraphicPolylin];        //绘制
[_mapView refresh];                                                 //刷新

提示:导航数据为何种空间参考系,得到的路线坐标也是相同的坐标系,如果和显示地图的参考系不匹配,则需要转换。例如,如果导航数据为经纬度坐标,地图为Web墨卡托坐标系,获取路径坐标之后,需将其坐标点转换,才能正常显示在地图上。

路径规划-室外.jpg